S01-22 JavaSE-项目:多用户即时通信系统
[TOC]
项目演示
- 功能包括:用户登录、拉取在线用户列表、私聊、群聊、发文件、服务器推送新闻
- 界面支持:登录菜单、二级操作菜单、在线用户展示、聊天记录显示
项目开发流程
- 需求分析:明确功能需求(登录、聊天、文件传输等)
- 设计阶段:UML类图、流程图、模块设计、数据库设计(使用HashMap模拟)
- 实现阶段:按模块开发功能
- 测试阶段:单元测试、集成测试
- 实施阶段:部署运行
- 维护阶段:bug修复、功能升级
核心功能
- 用户登录(模拟数据库:HashMap存储用户信息)
- 拉取在线用户列表
- 无异常退出(客户端、服务端)
- 私聊(点对点通信)
- 群聊(向所有在线用户发送消息)
- 发文件(点对点文件传输)
- 服务器推送新闻(群发系统消息)
功能实现-用户登录
核心思路
- 客户端:输入用户名/密码,发送登录请求
- 服务端:验证用户信息,验证通过则记录在线用户,返回登录成功
- 数据传输:使用对象流(Message类)封装数据
关键代码框架
java
// Message类(封装通信数据)
class Message implements Serializable {
private int type; // 消息类型:登录、私聊、群聊等
private String sender; // 发送者
private String getter; // 接收者
private String content; // 消息内容
private String sendTime; // 发送时间
// getter/setter
}
// 服务端登录处理
class ServerConnectClientThread extends Thread {
private Socket socket;
private String uid; // 客户端用户id
@Override
public void run() {
while (true) {
try {
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Message msg = (Message) ois.readObject();
if (msg.getType() == MessageType.MESSAGE_LOGIN) {
// 验证用户信息
String uid = msg.getSender();
String pwd = msg.getContent();
if ("100".equals(uid) && "123456".equals(pwd)) {
// 登录成功,添加到在线用户列表
Server.onlineUsers.put(uid, socket);
// 返回登录成功消息
Message response = new Message();
response.setType(MessageType.MESSAGE_LOGIN_SUCCEED);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(response);
} else {
// 登录失败
// ...
}
}
// 其他消息类型处理
} catch (Exception e) {
e.printStackTrace();
}
}
}
}功能实现-拉取在线用户列表
核心思路
- 客户端:发送拉取在线用户请求
- 服务端:遍历在线用户列表,返回给客户端
- 客户端:接收并显示在线用户
功能实现-私聊
核心思路
- 客户端:输入接收者id和消息内容,发送私聊请求
- 服务端:根据接收者id查找对应的Socket,转发消息
- 接收端:接收并显示私聊消息
功能实现-群聊
核心思路
- 客户端:输入群聊消息,发送群聊请求
- 服务端:遍历所有在线用户的Socket,转发消息
- 所有在线客户端:接收并显示群聊消息
功能实现-发文件
核心思路
- 客户端:输入接收者id、文件路径,读取文件字节数组,发送文件请求
- 服务端:根据接收者id查找Socket,转发文件数据
- 接收端:接收文件字节数组,保存到本地
功能实现-服务器推送新闻
核心思路
- 服务端:启动独立线程,定时或手动发送系统消息
- 遍历所有在线用户的Socket,群发推送消息
- 客户端:接收并显示推送消息
扩展功能
- 离线留言:用户未在线时,消息存储到服务器,登录后推送
- 离线发文件:用户未在线时,文件存储到服务器,登录后推送